// 文件名：deque_log_buffer.cpp
// 目的：实现环形日志缓冲（ring buffer）：容量溢出时自动丢弃最旧记录，保持最新 N 条。
// 设计要点：
//   - pushLog：尾部追加日志条目（带系统时间戳）；超容量则从头部弹出最旧条目；
//   - flush：遍历缓冲区，按秒级时间戳输出；
//   - 使用 deque 以 O(1) 均摊维护头尾；
//   - 时间戳使用 std::chrono::system_clock（墙钟）。
// 注意事项：
//   - system_clock 可能受系统时间调整影响；若需单调性可考虑 steady_clock；
//   - flush 格式仅演示用途，真实系统可格式化为 ISO-8601 或自定义格式；
//   - 若多线程写日志需加锁或采用无锁环形缓冲方案。

#include <deque>
#include <string>
#include <iostream>
#include <chrono>

class LogRingBuffer {
public:
    explicit LogRingBuffer(std::size_t capacity)
        : capacity_(capacity) {}

    // 追加一条日志；超过容量丢弃最旧条目
    void pushLog(std::string message) {
        auto ts = std::chrono::system_clock::now();
        entries_.push_back({ts, std::move(message)});
        if (entries_.size() > capacity_) {
            entries_.pop_front();
        }
    }

    // 将缓冲区内容刷出到指定输出流
    void flush(std::ostream& os) const {
        for (const auto& entry : entries_) {
            auto secs = std::chrono::time_point_cast<std::chrono::seconds>(entry.timestamp);
            os << "[" << secs.time_since_epoch().count() << "] " << entry.message << '\n';
        }
    }

private:
    struct Entry {
        std::chrono::system_clock::time_point timestamp;
        std::string message;
    };

    std::size_t capacity_;
    std::deque<Entry> entries_;
};

int main() {
    LogRingBuffer buffer(3);
    buffer.pushLog("system start");
    buffer.pushLog("connected to db");
    buffer.pushLog("cache warmup");
    buffer.pushLog("heartbeat"); // 最旧日志被淘汰

    buffer.flush(std::cout);
    return 0;
}